package com.cty.LinkedList;

public class SingleLinkedList {
    //创建一个头节点，不放任何数据，用于表示链表的头
    private heroNode head=new heroNode(0,"","");
    //返回头节点
    public heroNode getHead(){
        return head;
    }
    //写入添加方法
    //直接添加到链表的尾部
    public void add(heroNode hero){
        //因为头节点不能向后移动所以要创建一个临时指针用于遍历的向后移动
        heroNode temp=head;
        //添加数据的话要遍历链表
        while(true){
            //若该指针为空，则证明这是最后一个节点,将数据加入这个节点后面
            if(temp.next==null){
                temp.next=hero;
                break;
            }
            //若不是将节点后移
            temp=temp.next;
        }
    }
    //创建一个按编号顺序插入的方法
    public void addByOrder(heroNode hero){
        //创建一个辅助指针
        heroNode temp=head;
        //创建一个flag用于判断是否可以插入数据
        boolean flag=false;
        //遍历链表寻找插入的位置
        while(true){
            if(temp.next==null){
                break;
            }
            if(temp.next.no>hero.no){
                break;
            }else if(temp.next.no==hero.no){
                flag=true;
                break;
            }
            temp=temp.next;
        }
        if(flag){
            System.out.println("该编号的英雄已存在~~~");
        }else{
            //先改后面的指针在改前面的指针
            hero.next=temp.next;
            temp.next=hero;
        }
    }
    //创建一个更新的方法，根据编号跟新
    public void update(heroNode newHero){
        //先判断链表是否为空
        if (head.next==null) {
            System.out.println("链表为空~~~");
            return;
        }
        //先创建辅助指针
        heroNode temp=head.next;
        //创建一个flag用于判断是否可以修改
        boolean flag=false;
        while (true) {
            if (temp==null) {
                break;
            }else if (temp.no== newHero.no){
                flag=true;
                break;
            }
            temp=temp.next;
        }
        if (flag) {
            temp.name=newHero.name;
            temp.nickName= newHero.nickName;
        }else{
            System.out.println("未找到编号相同的英雄~~~");
        }
    }
    //创建一个删除的方法
    //被删除的节点有垃圾回收机制会被回收
    public void remove(int no){
        //判断链表是否为空
        if(head.next==null){
            System.out.println("链表为空~~~");
            return;
        }
        //创建一个辅助指针
        heroNode temp=head;
        //创建一个flag判断数据是否存在
        boolean flag=false;
        //遍历指针寻找要删除的节点
        while (true) {
            if(temp.next==null){
                break;
            }
            if (temp.next.no==no) {
                flag=true;
                break;
            }
            temp=temp.next;
        }
        if (flag) {
            temp.next=temp.next.next;
        }else {
            System.out.println("未找到该数据~~~");
        }

    }
    //创建一个链表遍历方法
    public void list(){
        //判断该链表是否为空
        if (head.next==null) {
            System.out.println("该链表为空链表~~");
            return;//结束该方法的调用
        }
        //创建一个辅助指针
        heroNode temp=head.next;
        while(true){
            if(temp==null){
                break;
            }
            System.out.println(temp);
            temp=temp.next;
        }
    }
}
